1.前言
2.程式實作&Dart語言學習: 第二層結構(Drug_Information_Page.dart
)
3.Dart語言學習: final
關鍵字、Scaffold
widget
4.實作結果
今天文章內容將延續昨日文章: 「Drug藥物資訊介面」設計靈感,實作第二層結構。該層結構主要功能有兩個,說明如下:
Drug_Information_Page.dart
)當應用程序擁有多層結構,為了更好地組織和管理程式碼,通常會將不同層級的功能和內容分開到獨立的模塊(module)或檔案中。每個模塊或檔案應該專注於特定功能或內容,以便更容易理解和維護。有助於避免將所有程式碼都擠在同一個 Dart 檔案中,從而使結構更加清晰和可維護。
因此,第二層結構可被視為獨立的元件,因此我們會創建一個名為 Drug_Information_Page.dart
的獨立檔案。這個檔案包含了 DrugInformationPage
這個小部件,並且可以被其他檔案引用。
為了在 Drug_Page.dart
(第一層結構)中使用DrugInformationPage
(第二層結構),我們需要在 Drug_Page.dart
中導入(import) Drug_Information_Page.dart
,這樣 Dart 才能找到 DrugInformationPage()
。
import 'Drug_Information_Page.dart
接著,將啟動DrugInformationPage()
設定在Navigator.push()這個操作手勢中,讓使用者在藥品清單介面點選特定藥品後,會跳轉到下一層結構,顯示該藥品更詳盡的資訊。
Drug_Information_Page.dart
架構說明先定義了一個名為 DrugInformationPage
的Flutter class,它是一個無狀態小部件 (StatelessWidget
),用於顯示藥物信息頁面。
該介面使用Scaffold
來創建應用程序骨架,包括應用欄和主要內容。在主要內容中,圖像和藥物信息被包裝在一個卡片 (Card
) 中,用於美化和布局。
每個藥物信息項目都使用Row
小部件在一行中顯示,左側是標籤(例如: 中文品名),右側是對應的資料(例如: 特定藥品的中文品名)。此外,這個頁面的標題是"藥物資訊",並且根據主題顏色進行了自定義。
Drug_Information_Page.dart
程式碼程式碼中加上註解,對細部區塊邏輯做說明
import 'package:flutter/material.dart';
// 提供了各種小部件和工具,用於使用Material Design(Google的設計語言)創建用戶界面
// 這包括按鈕、文本字段、應用程序欄、導航等小部件,所有這些都遵循Material Design的設計準則
// 定義了一個名為 DrugInformationPage 的Flutter小部件
// 它是一個無狀態小部件 (StatelessWidget),用於顯示藥物資料頁面
class DrugInformationPage extends StatelessWidget {
// 構造函数: 該函數接收兩個必要參數:data 和 imgSrc
const DrugInformationPage(
{Key? key, required this.data, required String this.imgSrc})
: super(key: key);
// 單一個藥品的資訊 & 位置
final Map<String, dynamic> data; // 儲存藥物資訊的Map
final String imgSrc; // 儲存藥物圖片的連結
// final 用於聲明 data 和 imgSrc 這兩個變數,這是因為它們在建構函數中被賦予值後,不應該再被更改。
// 這樣可以確保這些變數在整個 DrugInformationPage 小部件的生命週期內保持不變,以顯示正確的藥物信息。
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("藥物資訊"), // 顯示在應用欄上的標題
),
body: Column(
children: [
// 顯示藥物圖像的容器
Container(
alignment: Alignment.center,
child: Image.network(
imgSrc,
width: 200,
height: 200,
fit: BoxFit.contain,
),
),
// 顯示藥物信息的卡片
Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 中文品名
Row(
children: [
Expanded(
flex: 2,
child: Text("中文品名", style: TextStyle(fontSize: 12))),
Expanded(
flex: 3,
child: Text(
data["中文品名"],
style: TextStyle(fontSize: 12),
),
),
],
),
// 英文品名
// (以下類似,顯示不同的藥物信息項目)
Row(
children: [
Expanded(
flex: 2,
child: Text("英文品名", style: TextStyle(fontSize: 12))),
Expanded(
flex: 3,
child: Text(
data["英文品名"],
style: TextStyle(fontSize: 12),
),
),
],
),
Row(
children: [
Expanded(
flex: 2,
child: Text("適應症", style: TextStyle(fontSize: 12))),
Expanded(
flex: 3,
child: Text(
data["適應症"],
style: TextStyle(fontSize: 12),
),
),
],
),
Row(
children: [
Expanded(
flex: 2,
child: Text("副作用", style: TextStyle(fontSize: 12))),
Expanded(
flex: 3,
child: Text(
data["副作用"],
style: TextStyle(fontSize: 12),
),
),
],
),
Row(
children: [
Expanded(
flex: 2,
child: Text("劑型", style: TextStyle(fontSize: 12))),
Expanded(
flex: 3,
child: Text(
data["劑型"],
style: TextStyle(fontSize: 12),
),
),
],
),
Row(
children: [
Expanded(
flex: 2,
child: Text("常見用量", style: TextStyle(fontSize: 12))),
Expanded(
flex: 3,
child: Text(
data["常見用量"],
style: TextStyle(fontSize: 12),
),
),
],
),
Row(
children: [
Expanded(
flex: 2,
child: Text("注意事項", style: TextStyle(fontSize: 12))),
Expanded(
flex: 3,
child: Text(
data["注意事項"],
style: TextStyle(fontSize: 12),
),
),
],
),
],
)),
),
],
),
);
}
}
final
關鍵字、Scaffold
widget(1)final
: 是一個在Dart中使用的關鍵字,它用於聲明不可變的變數(或常量)
final
時,它的值將在初始化後無法被更改。這代表一旦賦值,該變數將保持不變,無法再被更新。final
變數可以是運行時計算的常數。這意味著它們的值可以在運行時計算,這使它們在需要在運行時確定值的情況下非常有用。final
變數進行更多的優化,因為知道它們不會在運行時更改。這將幫助提高代碼的性能。final
可以提高代碼的安全性,因為它可以防止在不應該更改變數的地方意外更改它們的值。(2)Scaffold
: 是一個重要的小部件(widget),用於創建介面的基本骨架。它提供應用程序的常見結構元素,如應用欄、側邊抽屜、底部導航欄、浮動按鈕等,以幫助開發者快速構建介面的基本框架。以下是 Scaffold
的主要元素和用途:
總結,Scaffold
提供一個通用的應用程序佈局結構,使開發者能夠輕鬆根據應用程序的設計,依據需求自定義 Scaffold
的各個元素,以實現特定的介面和功能。
每個藥品都能點選,看到如下圖的完整藥品資訊
保持樂觀,不必追悔過去,也不必忐忑面對未來,專注於現在就好。─ 阿爾弗雷德.阿德勒,奧地利心理學家
Stay optimistic, no need to regret the past, and no need to be anxious about the future, just focus on the present. -Alfred Adler, Austrian psychologist
充實又愉快的週六又即將結束啦~!!